package com.proxy.demo07;

import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类
 */
public class DynamicProxy {
    //定义要代理哪个类
    private Object target =null;

    //通过构造函数传递被代理对象
    public DynamicProxy(Object target){
        //生成被代理类的代理类
        this.target = Proxy.newProxyInstance(target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), new MyInvocationHandler(target));
    }

    //执行代理类的方法
    public Object exec(String methodName,Object...args){
        //返回值
        Object result = null;
        //方法中的参数类型
        Class[] c= new Class[args.length];
        int i=0;
        //获得参数的类型
        for(Object o:args){
            c[i] = o.getClass();
            i++;
        }

        try {
            //根据方法名称和参数类型查找到唯一一个方法
            Method method=this.target.getClass().getMethod(methodName, c);
            //执行该方法
            result = method.invoke(this.target, args);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return result;
    }
}
